package com.simpou.commons.utils.pagination;

import com.simpou.commons.utils.validation.Assertions;

import lombok.EqualsAndHashCode;
import lombok.Getter;


/**
 * Define uma faixa de elementos dada uma lista completa.
 *
 * @author Jonas Pereira
 * @since 2011-07-12
 * @version 2012-07-15
 */
@EqualsAndHashCode
public final class PageLimits {
    /**
     * Indice do primeiro elemento da faixa.
     */
    @Getter
    private final int offset;

    /**
     * Quantidade de elementos na faixa a partir do primeiro inclusive.
     */
    @Getter
    private final int size;

    /**
     * Numeração de elementos é a partir de zero.
     *
     * @param offset Indice do primeiro elemento da faixa.
     * @param size Quantidade de elementos na faixa a partir do primeiro
     * inclusive.
     */
    public PageLimits(final int offset, final int size) {
        this.offset = Assertions.greaterThan(offset, -1,
                "Offset must be non negative.");
        this.size = Assertions.greaterThan(size, -1, "Size must be non negative.");
    }

    /**
     * <p>getFirst.</p>
     *
     * @return Indice do primeiro elemento.
     */
    public int getFirst() {
        return offset;
    }

    /**
     * <p>getLast.</p>
     *
     * @return Indice do último elemento.
     */
    public int getLast() {
        return (offset + size) - 1;
    }

    @Override
    public String toString() {
        return "Limits from " + getFirst() + " to " + getLast();
    }
}
